﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Systemet.Views
{
    public partial class Uppfoljning : UserControl
    {
        private SideViews.SideUppfoljning sUppfoljning;
        private bool regUpparbetat;
        private DataTable dt;
        private Domain.UppföljningController uC;
        List<Prognos> oldPrognoses;
        List<Uppföljning> oldUppföljningar;
        private int prognosedMonths;
        private int prognosedCosts;
        private string cellValue;
        private int choosenMonth;

        public Uppfoljning()
        {
            InitializeComponent();
            AccessController.Instance.MainView = this;
            regUpparbetat = AccessController.Instance.UserRoleLoggedInUser.UppföljningImportTxt;
            btnImportTxtfil.Enabled = AccessController.Instance.UserRoleLoggedInUser.UppföljningImportTxt;
        }
        //Click eventet för import av txtfil
        private void btnImportTxtfil_Click(object sender, EventArgs e)
        {
            Domain.TextfileController tC = new Domain.TextfileController();
            tC.readUppfoljningFile(choosenMonth);
            cmBMonth_SelectedIndexChanged(null, null);
        }
        //CB beräknar korrekt år om man vill spara data en längre period
        private void cbAr_SelectedIndexChanged(object sender, EventArgs e)
        {
            clearDatagridView();
            int number;
            if (int.TryParse(cbAr.Text, out number))
            {
                prognosedMonths = uC.GetValidatedPrognoses(number);
            }
        }
        //Loadar 
        private void Uppfoljning_Load(object sender, EventArgs e)
        {
            uC = new Domain.UppföljningController();
            cbAr.Items.AddRange(uC.GetAllBudgetedYears().ToArray());
            cbAr.SelectedIndex = cbAr.Items.Count - 1;
            btnImportTxtfil.Enabled = false;
        }
        //Event för Månad Combobox för låsning av knapp/månad/felmeddelande osv.
        private void cmBMonth_SelectedIndexChanged(object sender, EventArgs e)
        {
            clearDatagridView();
            gBProgResult.Visible = false;
            uC = new Domain.UppföljningController();
            int number;
            if (int.TryParse(cbAr.Text, out number))
            {
                prognosedMonths = uC.GetValidatedPrognoses(number);
                prognosedCosts = uC.GetValidatedKostnader(number);
            }

            int månad = cmBMonth.SelectedIndex + 1;
            choosenMonth = månad;
            
            if (månad == 1 && prognosedMonths == 0 && prognosedCosts == 0) //Nytt kalenderår
            {
                btnImportTxtfil.Enabled = false;
                MessageBox.Show("Du måste låsa alla prognoser för nuvarande månad först");
            }

            else if (månad == prognosedCosts)
            {
                UpdateDGV(uC.GetPrognos(månad));
                btnImportTxtfil.Enabled = false;
            }

            else if (månad > prognosedMonths || !uC.ValidatePrognosesLocked(choosenMonth))
            {
                btnImportTxtfil.Enabled = false;
                MessageBox.Show("Du måste låsa alla prognoser i Prognostisering för föregående månad först");
            }
            else if (månad == prognosedCosts + 1 && uC.ValidateCostsLocked(choosenMonth))
            {
                SetImportButton();
            }

            else if (månad <= prognosedMonths && uC.ValidatePrognosesLocked(choosenMonth))
            {
                UpdateDGV(uC.GetPrognos(månad));
                btnImportTxtfil.Enabled = false;
            }
            else if (månad <= prognosedCosts && uC.ValidateCostsLocked(choosenMonth))
            {
                UpdateDGV(uC.GetPrognos(månad));
                btnImportTxtfil.Enabled = false;
            }
        }
        //Login bool
        private bool SetImportButton()
        {
            if (uC.ValidateCostsLocked(choosenMonth))
            {
                btnImportTxtfil.Enabled = regUpparbetat;
                return true;
            }
            return false;
        }
        //Clearar datagridview
        public void clearDatagridView()
        {
            if (this.uppDGV.DataSource != null)
            {
                this.uppDGV.DataSource = null;
            }
            else
            {
                this.uppDGV.Rows.Clear();
            }
            cellValue = null;
        }

        //Skapar datatable med columner
        private void UpdateDGV(object dgv)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("ProduktID");
            dt.Columns.Add("Produkt");
            dt.Columns.Add("Intäkter");
            dt.Columns.Add("Kostnader");

            uC = new Domain.UppföljningController();
            int månad = choosenMonth;
            List<Prognos> prognoses = uC.GetPrognos(månad);
            uC = new Domain.UppföljningController();

            oldPrognoses = new List<Prognos>();
            oldUppföljningar = new List<Uppföljning>();
            oldPrognoses = uC.RetrieveEarlierPrognoses(choosenMonth);
            oldUppföljningar = uC.RetriveEarlierUpp(choosenMonth);

            foreach (Prognos p in prognoses)
            {
                List<Uppföljning> ib = uC.GetUppföljning(månad);
                DataRow dr = dt.NewRow();
                dt.Rows.Add(dr);
                dr["Intäkter"] = 0;
                dr["Kostnader"] = 0;
                foreach (DataRow dR in dt.Rows)
                {
                    foreach (DataColumn dgvC in dt.Columns)
                    {
                        if (dgvC.ColumnName == "Intäkter")
                        {
                            int Intäkter = FilterprognosValueTotalIntäkt(dR["ProduktID"].ToString(), choosenMonth);

                            if (Intäkter != 0)
                            {
                                dR["Intäkter"] = (Intäkter).ToString();
                                dR["Intäkter"] = Intäkter;
                            }

                        }
                        if (dgvC.ColumnName == "Kostnader")
                        {
                            int Kostnader = FilterUppföljningValueTotalKostnad(dR["ProduktID"].ToString(), choosenMonth);
                            // int kostnadmån = int.Parse(dR["Kostnader"].ToString());
                            if (Kostnader != 0)
                            {
                                dR["Kostnader"] = (Kostnader).ToString();
                                dR["Kostnader"] = Kostnader;
                            }
                        }
                    }

                }
                dr["Produkt"] = p.Produkt;
                dr["ProduktID"] = p.ProduktID;
                uppDGV.DataSource = dt;
                uppDGV.Columns[0].Visible = false;
                uppDGV.Columns[2].Visible = true;
                uppDGV.Columns[3].Visible = true;
            }
        }
        //Räknar ut IntäkterAcc för varje månad
        private int FilterprognosValueTotalIntäkt(string prodID, int month)
        {
            int intäkt = 0;
            foreach (Prognos p in oldPrognoses)
            {
                if (p.ProduktID == prodID && p.Datum.Month <= month)
                {
                    intäkt += (int)p.Utfallmånad;
                }
            }
            return intäkt;
        }
        //Metoden räknar ut KostnaderAcc för varje månad
        private int FilterUppföljningValueTotalKostnad(string prodID, int month)
        {
            int kostnader = 0;
            foreach (Uppföljning p in oldUppföljningar)
            {
                if (p.ProdID == prodID && p.Date.Month <= month)
                {
                    kostnader += (int)p.Kostnadsbelopp;
                }
            }
            return kostnader;
        }
        //Event för när man klickar på gridviewn och öppnar gBProgResult
        private void uppDGV_CellClick(object sender, DataGridViewCellEventArgs e)
        {

            gBProgResult.Visible = true;
            int currentRow = uppDGV.CurrentCell.RowIndex;
            int res = 0;
            try
            {
                string produktNamn = uppDGV.Rows[currentRow].Cells[1].Value.ToString();
                char[] splitKriterier = new char[] { '-' };
                string[] splitProdNamn = produktNamn.Split(splitKriterier, StringSplitOptions.RemoveEmptyEntries);
                if (splitProdNamn != null)
                {
                    LabelProdNamn.Text = splitProdNamn[0].ToString();
                    LabelFaktistMånad.Text = cmBMonth.Text;

                    if (uppDGV.Rows[currentRow].Cells[2].Value.ToString() != null)
                    {
                        labelFaktistIntäkt.Text = uppDGV.Rows[currentRow].Cells[2].Value.ToString();
                    }
                    if (uppDGV.Rows[currentRow].Cells[3].Value.ToString() != null)
                    {
                        labelFaktistKostnad.Text = uppDGV.Rows[currentRow].Cells[3].Value.ToString();
                    }
                    res = Convert.ToInt32(labelFaktistIntäkt.Text) - Convert.ToInt32(labelFaktistKostnad.Text);
                    labelFaktistResultat.Text = res.ToString();
                }
            }
            catch (Exception Exep)
            {
            }
        }
    }
}
